package com.colabo.j2ee.web.core.log;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.time.StopWatch;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.colabo.j2ee.web.core.common.CommonConstants;
import com.colabo.j2ee.web.core.util.PropertyUtil;

/**
 * 通过AOP方式拦截类中某个方法的执行前和执行后步骤，然后记录方法的执行时间
 */
public class LogMethodTimeAdvice implements MethodInterceptor {
	protected final Log logger = LogFactory.getLog(LogMethodTimeAdvice.class);

	/**
	 * 拦截要执行的目标方法
	 */
	public Object invoke(MethodInvocation invocation) throws Throwable {
		// 用 commons-lang 提供的 StopWatch 计时，Spring 也提供了一个 StopWatch
		StopWatch clock = new StopWatch();
		clock.start(); // 计时开始
		Object result = invocation.proceed();
		clock.stop(); // 计时结束

		// 方法参数类型，转换成简单类型
		Class[] params = invocation.getMethod().getParameterTypes();
		String[] simpleParams = new String[params.length];
		for (int i = 0; i < params.length; i++) {
			simpleParams[i] = params[i].getName();
		}

		logger.info(PropertyUtil.getPropertyByKey(CommonConstants.MSG_LOG_METHODTIME, new String[] {
				invocation.getThis().getClass().getName(), invocation.getMethod().getName(), clock.getTime() + "" }));
		return result;
	}
}
